package com.wushijia.highconcurrency;

/**
 * description:实战Java高并发程序设计，linux创始人Linus表示只有图像处理和服务器端才需要高并发
 *
 * 同步：Synchronous 异步：Asynchronous
 *
 * 并发：Concurrency，一个cpu来回切换执行多个任务 并行：Parallelism，多个cpu同时执行多个任务（多核cpu）
 *
 * 死锁： 饥饿： 活锁：主动释放资源给对方，但对方无法同时拥有资源
 *
 * 并发级别：阻塞（使用synchronized,重入锁），无饥饿（非公平锁产生饥饿，公平锁不产生饥饿），
 *
 * 无障碍（Obstruction-Free,其实是一种乐观锁，一旦检测冲突就进行回滚，依赖一个"一致性标记"来判断是否被修改过），
 *
 * 无锁（Lock-Free,只要一个线程可以在有限步内完成操作）
 *
 * 无等待：wait-Free,所有现场在有限步内完成操作,典型的RCU-（Read-copy-Update）,对数据的读不加限制，所有的读线程都是无等待的
 *
 * @author yang
 * @date 2018/5/5 16:03
 */
public class Chapter1 {

  public static long t = 0;

  public static class ChangeT implements Runnable {

    private long to;

    public ChangeT(long to) {
      this.to = to;
    }

    @Override
    public void run() {
      while (true) {
        Chapter1.t = to;
        Thread.yield();
      }
    }
  }

  public static class ReadT implements Runnable {

    @Override
    public void run() {
      while (true) {
        long temp = Chapter1.t;
        if (temp != 111L && temp != 222L && temp != 333L) {
          //在32位系统上输出错误结果，但是在64位系统上可以，因为long占8个字节，64位，如果在32位系统上读取会出现错误，因为在32位系统上long型整数读写操作不是原子性
          System.out.println(temp);
        }
        Thread.yield();
      }
    }
  }

  public static void main(String[] args) {
    new Thread(new ChangeT(111L)).start();
    new Thread(new ChangeT(222L)).start();
    new Thread(new ChangeT(333L)).start();
    new Thread(new ReadT()).start();
  }
}
